<?php
/**
 * Classe que carrega as mensagens que serão exibidas nas views.
 * @author CPD Desenvolvimento UEPB
 */
class Mensagem
{

	// Constantes para representar os tipos de erros
	const SUCESSO = "sucesso";
	const ERRO = "erro";
	const AVISO = "aviso";

	const TITULO_AVISO = "Atenção!";

	// Variáveis que carregam as mensagens
	private static $texto = NULL;
	private static $tipo = NULL;

	/**
	 * Configura uma mensagem de um certo tipo.
	 *
	 * @param $texto O texto da mensagem.
	 * @param $tipo O tipo da mensagem, que pode ser uma das constantes definidas no topo dessa classe.
	 * @param $separador Elemento HTML para separa as mensagens, em caso de envio de vários textos.
	 */
	public static function setMensagem( $textos, $tipo, $separador = "p" )
	{
		if (is_array($textos)) {
			$mensagem = "";
			foreach ($textos as $texto) {
				$mensagem .= "<{$separador}>";
				$mensagem .= $texto;
				$mensagem .= "</{$separador}>";
			}
		} else {
			$mensagem = $textos;
		}
		self::$texto = $mensagem;
		self::$tipo = $tipo;
	}

	/**
	 * Atalho para a configuração de mensagens de sucesso.
	 *
	 * @param $texto O texto da mensagem.
	 */
	public static function setMensagemSucesso( $texto )
	{
		self::setMensagem( $texto, self::SUCESSO );
	}

	/**
	 * Atalho para a configuração de mensagens de aviso.
	 *
	 * @param $texto O texto da mensagem.
	 */
	public static function setMensagemAviso( $texto )
	{
		self::setMensagem( $texto, self::AVISO );
	}

	/**
	 * Atalho para a configuração de mensagens de erro.
	 *
	 * @param $texto O texto da mensagem.
	 */
	public static function setMensagemErro( $texto )
	{
		self::setMensagem( $texto, self::ERRO );
	}

	/**
	 * Atalho para a configuração de mensagens de erro
	 * a partir de uma exceção.
	 *
	 * @param $e A exceção da qual a mensagem de erro será retirada.
	 */
	public static function setExcecao( Exception $e )
	{
		if ( $e != NULL ) {
			self::setMensagem( $e->getMessage(), self::ERRO );
		}
	}

	/**
	 * Atalho para a configuração de mensagens de aviso
	 * a partir de uma exceção elemento nao encontrado.
	 *
	 * @param $e A exceção da qual a mensagem de erro será retirada.
	 */
	public static function setExcecaoAviso( ExceptionElementoNaoEncontrado $en )
	{
		if ( $en != NULL ) {
			self::setMensagem( $en->getMessage(), self::AVISO );
		}
	}

	/**
	 * Elimina (limpa) a mensagem configurada atualmente.
	 */
	public static function reset()
	{
		self::setMensagem(NULL, NULL);
	}

	/**
	 * Verifica se existe uma mensagem de erro configurada.
	 *
	 * @return unknown_type
	 */
	public static function existe()
	{
		return self::getTexto() != NULL && self::getTipo() != NULL;
	}

	/**
	 * Obtém o texto da mensagem.
	 *
	 * @return O texto da mensagem.
	 */
	public static function getTexto()
	{
		return self::$texto;
	}

	/**
	 * Obtém o tipo da mensagem.
	 *
	 * @return O tipo da mensagem.
	 */
	private static function getTipo()
	{
		return self::$tipo;
	}

	/**
	 * Obtém a classe CSS do tipo dessa mensagem.
	 *
	 * @return O texto com o nome da classe CSS para essa mensagem.
	 */
	public static function getClasseTipo()
	{
		// atualmente, a classe é o texto da constante
		return self::$tipo;
	}

	/**
	 * Obtém o título apropriado para a mensagem.
	 *
	 * @return O título para a mensagem.
	 */
	public static function getTituloTipo()
	{
		// atualmente, o título é o texto da constante
		// com a primeira letra em upper
		return ucfirst(self::$tipo);
	}
}